/***************************************************************************
 创建者: 华磊
 开始时间: 2018.8.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef CALLINSTRUCTIONLOGIC_H
#define CALLINSTRUCTIONLOGIC_H
#include "callinstruction.h"
#include "programset.h"
#include "instructionEnum.h"
#include "robotio.h"
#include "pointdata.h"
#include "mccontrollerthread.h"

class ProgramEngine;
/**
 * @brief The CallInstructionLogic class 指令逻辑处理类
 */
class CallInstructionLogic
{
public:
    CallInstructionLogic(int robotIdIn, ProgramSet* programSetIn, RobotIo* ioControllerIn
                         , ProgramEngine* programEngineIn, PointData *pointDataIn
                         , QVector <PointPro> *getPointProListIn,
                         QVector <QVector <PointPro> > *allPointProListIn,
                         McControllerThread *programMcControllerIn);

 public:
    /**
     * @brief startCall             获取call指令后的操作
     * @param programNum            正在运行的program的Number
     * @param callProgramName       被ｃａｌｌ的程序名称
     * @return                      返回１表示运行到了最后一行
     */
    E_PROGRAM_LOOP_RESULT startCall(int fatherProgramIndex, QString tocallProgramName);

private:
//    bool changePointPro(int programIndex);
    bool loadProgramFile(int fatherProgramIndex, QString programFileIn);
    bool isProgramFileLoaded(QString programFileIn, int& programIndexOut);

    /**
     * @brief addMsg  , 添加消息反馈
     * @param messageLevel
     * @param componentName
     * @param messageType
     * @param messageCode
     * @param robotId
     * @param parameter1
     * @param parameter2
     * @param parameter3
     * @param parameter4
     */
    void addMsg( int messageLevel,
                 std::string componentName,
                 std::string messageType,
                 int messageCode,
                 int robotId,
                 int parameter1 = 0,
                 int parameter2 = 0,
                 int parameter3 = 0,
                 int parameter4 = 0,
                 QString message= "");

private:
    int robotId;
    ProgramSet* programSet;
    RobotIo* ioController;
    ProgramEngine* programEngine;

    /**
     * @brief pointData         点位数据组件
     */
    PointData *pointData;

    /**
     * @brief getPointProList   保存普通点到ｐｏｉｎｔＤａｔａ组件的操作
     */
    QVector <PointPro> *getPointProList;

    /****************************************************
     * 日期：2017－3－2２
     * 添加人：ｓｔｅｖｅｎ
     * 添加内容：多任务下存储普通点和码垛点的容器
     * ****************************************************/
    /**
     * @brief allPointProList       多任务下的所有的普通点信息
     */
    QVector <QVector <PointPro> > *allPointProList;

    /**
     * @brief programMcController       算法线程指针
     */
    McControllerThread *programMcController;
};

#endif // CALLINSTRUCTIONLOGIC_H
